package mybox.engine;

import java.io.IOException;

public class Schachtel implements Figur {
	
	public static final String FFX="FFX";
	public static final String MXMX="MXMX";
	
	public static final String GRUNDPLATTE1 ="GRUNDPLATTE1";
	public static final String GRUNDPLATTE2 ="GRUNDPLATTE2";
	public static final String LAENGENPLATTE1 ="LAENGENPLATTE1";
	public static final String LAENGENPLATTE2 ="LAENGENPLATTE2";	
	public static final String SEITENPLATTE1 ="SEITENPLATTE1";
	public static final String SEITENPLATTE2 ="SEITENPLATTE2";
	
	public static final String isLade = "Lade";
	
	public String typ;
	public String xTyp;
		
	File4Qcad file4qcad;
	public double laenge;
	public double breite;
	public double hoehe;
	public double extension;
	double materialDicke; 
	double zinkungsFaktor;
	double laserBreite;
	
	public QVector centerGrundPlatte1;
	public QVector centerGrundPlatte2;
	
	public Platte grundPlatte1;
	public Platte grundPlatte2;
	
	public Platte laengenPlatte1;
	public Platte laengenPlatte2;
	
	public Platte seitenPlatte1;
	public Platte seitenPlatte2;
	
	public Schachtel(
			File4Qcad file4qcad,
			QVector aktPosStart,
			double laenge, 
			double breite, 
			double hoehe, 
			double materialDicke, 
			double zinkungsFaktor,
			double laserBreite
			) throws SecurityException, IOException {
		
		initSchachtel(file4qcad,
				aktPosStart,
				laenge, 
				breite, 
				hoehe, 
				0,
				materialDicke, 
				zinkungsFaktor,
				laserBreite,
				null,
				null);
	}
	
	
	public Schachtel(
			File4Qcad file4qcad,
			QVector aktPosStart,
			double laenge, 
			double breite, 
			double hoehe, 
			double materialDicke, 
			double zinkungsFaktor,
			double laserBreite,
			String typ) 
	throws SecurityException, IOException {
		
		initSchachtel(file4qcad,
				aktPosStart,
				laenge, 
				breite, 
				hoehe, 
				0,
				materialDicke, 
				zinkungsFaktor,
				laserBreite,
				typ,
				null);
								
	}
	
	public Schachtel(
			File4Qcad file4qcad,
			QVector aktPosStart,
			double laenge, 
			double breite, 
			double hoehe, 
			double materialDicke,
			double zinkungsFaktor,
			double laserBreite,
			String typ,
			String xTyp)
	throws SecurityException, IOException {
		
		initSchachtel(file4qcad,
				aktPosStart,
				laenge, 
				breite, 
				hoehe, 
				0,
				materialDicke, 
				zinkungsFaktor,
				laserBreite,
				typ,
				xTyp);
								
	}
	
	public Schachtel(
			File4Qcad file4qcad,
			QVector aktPosStart,
			double laenge, 
			double breite, 
			double hoehe,
			double extension,
			double materialDicke, 
			double zinkungsFaktor,
			double laserBreite) 
	throws SecurityException, IOException {
		
		initSchachtel(file4qcad,
				aktPosStart,
				laenge, 
				breite, 
				hoehe, 
				extension,
				materialDicke, 
				zinkungsFaktor,
				laserBreite,
				null,
				null);
				
	}
	
	public Schachtel(
			File4Qcad file4qcad,
			QVector aktPosStart,
			double laenge, 
			double breite, 
			double hoehe,
			double extension,
			double materialDicke, 
			double zinkungsFaktor,
			double laserBreite,
			String typ,
			String xTyp) 
	throws SecurityException, IOException {
		
		initSchachtel(file4qcad,
				aktPosStart,
				laenge, 
				breite, 
				hoehe, 
				extension,
				materialDicke, 
				zinkungsFaktor,
				laserBreite,
				typ,
				xTyp);
				
	}
	
		
	
	private void initSchachtel(
			File4Qcad file4qcad,
			QVector aktPosStart,
			double laenge, 
			double breite, 
			double hoehe, 
			double extension,
			double materialDicke, 
			double zinkungsFaktor,
			double laserBreite,
			String typ,
			String xTyp) {
		
		boolean[] randGlattLaengenPlatte;
		boolean[] randGlattBreitenPlatte;
		
		this.typ=typ;
		this.xTyp=xTyp;
		if (typ!=null && typ.equalsIgnoreCase(Schachtel.isLade)) {
			hoehe=hoehe+materialDicke;
			randGlattLaengenPlatte= new boolean[]{true,false,false,false};
			randGlattBreitenPlatte= new boolean[]{false,true,false,false};
		} else {
			randGlattLaengenPlatte= new boolean[]{false,false,false,false};			
			randGlattBreitenPlatte= new boolean[]{false,false,false,false};
		}
		
		
		this.laenge=laenge;
		this.breite=breite;
		this.hoehe=hoehe;
		this.extension=extension;
		this.materialDicke=materialDicke;
		this.zinkungsFaktor=zinkungsFaktor;
		this.laserBreite=laserBreite;
		
		this.file4qcad = file4qcad; 		
		QVector aktPos = new QVector(aktPosStart.x,aktPosStart.y);
		
		
		
		//Grundplatte1
		if (extension>0 && xTyp.equalsIgnoreCase(FFX)) 	grundPlatte1 = new Platte(file4qcad, aktPos, Platte.FFX, laenge,breite, extension, materialDicke,laserBreite);
		else 				grundPlatte1 = new Platte(file4qcad, aktPos, Platte.FF, laenge,breite,materialDicke,zinkungsFaktor,laserBreite);
		
		
		
		//Laengenplatte1
		aktPos.y-=hoehe+extension*2;		
		if (extension>0 && xTyp.equalsIgnoreCase(MXMX)) {
			laengenPlatte1 = new Platte(file4qcad, aktPos, Platte.MXF, laenge,hoehe,extension, materialDicke,zinkungsFaktor,laserBreite);					
		} else {
			laengenPlatte1 = new Platte(file4qcad, aktPos, Platte.MF, laenge,hoehe,materialDicke,zinkungsFaktor,laserBreite,randGlattLaengenPlatte);
		}
		
		aktPos.x+=laenge+extension+5; aktPos.y+=hoehe+extension*2;
		
		//Grundplatte2
		
		if (extension>0 && xTyp.equalsIgnoreCase(FFX)) grundPlatte2 =new Platte(file4qcad, aktPos, Platte.FFX, laenge,breite,extension, materialDicke,zinkungsFaktor,laserBreite);
		else
			if (typ==null || !typ.equalsIgnoreCase(Schachtel.isLade))
				grundPlatte2 = new Platte(file4qcad, aktPos, Platte.FF, laenge,breite,materialDicke,zinkungsFaktor,laserBreite);
		
			
		
		//Laengenplatte2
		aktPos.y-=hoehe+2*extension;	
		
		laengenPlatte2 = new Platte(file4qcad, aktPos, Platte.MF, laenge,hoehe,materialDicke,zinkungsFaktor,laserBreite,randGlattLaengenPlatte);
		
				
		aktPos.x+=laenge+extension+materialDicke+3; aktPos.y+=hoehe+materialDicke+2*extension;
		seitenPlatte1 = new Platte(file4qcad, aktPos, Platte.MMR, hoehe,breite,materialDicke,zinkungsFaktor,laserBreite,randGlattBreitenPlatte);
		aktPos.y-=breite+materialDicke;
		seitenPlatte2 = new Platte(file4qcad, aktPos, Platte.MMR, hoehe,breite,materialDicke,zinkungsFaktor,laserBreite,randGlattBreitenPlatte);
		
	}
	
	public void draw() {
		grundPlatte1.draw();
		laengenPlatte1.draw();
		
		
		if (typ==null || !typ.equalsIgnoreCase(Schachtel.isLade))
		grundPlatte2.draw();
		laengenPlatte2.draw();
		seitenPlatte1.draw();
		seitenPlatte2.draw();
	}
		
	
	public void drawCircle2Center(double radius, String plattenType) {
		
		mapPlatte(plattenType).drawCenter(radius);
			
	}
	
	public void drawServoJamaica() {
		
		seitenPlatte1.drawRectangle(1.5*materialDicke);		
		seitenPlatte2.drawRectangle(1.5*materialDicke);
		laengenPlatte1.drawJamaica(materialDicke, materialDicke);
		laengenPlatte2.drawJamaica(materialDicke, materialDicke);
		
	}
	
	public void drawGegenServoJamaica() {
		grundPlatte1.drawJamaica(materialDicke, materialDicke);
		grundPlatte2.drawJamaica(materialDicke, materialDicke);
		seitenPlatte1.drawRectangle(1.5*materialDicke);
		seitenPlatte2.drawRectangle(1.5*materialDicke);
	}
	
	public void drawZigZagCircles(int anzZigZag, double radius, String plattenType) {
		
		mapPlatte(plattenType).drawZigZagHoles(radius,anzZigZag);
		
	}
	
	public Platte mapPlatte(String plattenType) {
		Platte retPlatte=null;
		
		if (plattenType.equalsIgnoreCase(GRUNDPLATTE1)) 	retPlatte= grundPlatte1;
		if (plattenType.equalsIgnoreCase(GRUNDPLATTE2))		retPlatte= grundPlatte2;
		if (plattenType.equalsIgnoreCase(LAENGENPLATTE1)) 	retPlatte=laengenPlatte1;
		if (plattenType.equalsIgnoreCase(LAENGENPLATTE2))	retPlatte= laengenPlatte2;
		if (plattenType.equalsIgnoreCase(SEITENPLATTE1)) 	retPlatte= seitenPlatte1;
		if (plattenType.equalsIgnoreCase(SEITENPLATTE2))	retPlatte= seitenPlatte2;
	
		
		return retPlatte;
	}
	

}
